\chapter{Metodología}

En la primera etapa de la realización de éste proyecto, se investigó sobre diversos conceptos, 
algoritmos y herramientas que podrían ser de ayuda para el reconocimiento facial.

 \section{Investigación}

 En los sistemas de autenticación, se tiene como objetivo que a partir de una imagen que contenga 
 un rostro, el algoritmo debe poder descifrar la identidad de la persona después de haberla agregado
 al banco de datos. Para resolver este problema se busca extraer las características más significativas
 de cada imagen que nos permitan discriminar las caracter\'isticas principales, de tal manera que no
 tenga que manipularse directamente. 
 Esto permite evadir dos problemas que surgen del uso de la imagen original: su alta variabilidad 
 incluso para una misma persona y alta dimensión.

 Para el reconocimiento e identificación de rostros, existen varios algoritmos de proyección de
 subespacios de menor dimensión. Estos son usados para obtener representaciones de baja dimensión
 que permitan aplicar algoritmos de clasificación. 

  \begin{center}
  \begin{figure}[ht]
  \centering
  \includegraphics[width=1.0in]{images/proceso01}
  \caption{Proceso para el reconocimiento facial.}
  \label{fig:Proceso para el reconocimiento facial}
  \end{figure}
  \end{center}

 Dos algoritmos comúnmente usados son: el Análisis de Componentes Principales (PCA) y el Análisis
 Discriminante Lineal (LDA) ya que son métodos estadísticos de simplificación y reducción de la 
 dimensión. LDA es una técnica de aprendizaje supervisado para clasificar datos. Esta técnica busca
 obtener una proyección de datos en un espacio de menor dimensión que los datos originales, la 
 idea principal es separar las clases entrenando el sistema con patrones etiquetados. A diferencia 
 del PCA el LDA no busca minimizar el error de representación.

   
  \subsection{Análisis de Componentes Principales}

  EL PCA es una forma de identificar y representar los datos de tal forma que destaquen sus semejanzas
  y diferencias. Ya que los patrones en los datos son difíciles de encontrar cuando se trata de una 
  dimensión alta, donde no podemos representarlos gráficamente. Una de sus ventajas, es que una vez que 
  se comprimen los datos, reduciendo el número de dimensiones, se pueden encontrar patrones en los 
  datos, la gran ventaja es que esto se puede lograr sin la pérdida de gran parte de la información.
  Esta técnica es comúnmente utilizada en la compresión de imágenes.

  Un problema típico en el análisis de datos multivariantes es la reducción de la dimensionalidad
  de los mismos. El objetivo es poder describir con precisión los valores por medio de un subconjunto
  de los mismos. El análisis de componentes principales tiene este objetivo: dadas c  muestras de un
  conjunto de n variables se analiza si es posible representar adecuadamente esa información por un
  número menor de variables construidas como combinaciones lineales de las originales.

  \begin{center}
  \begin{figure}[ht]
  \centering
  \includegraphics[width=2.5in]{images/ajustelineal} % 
  \caption{Enfoque descriptivo del análisis de componentes principales.} 
  \label{fig:ajustelineal}
  \end{figure}
  \end{center}


  El objetivo es encontrar un espacio de dimensión más pequeña que represente a los datos. La
  figura 2.2 muestra un ejemplo para R2  en el que se han dibujado una serie de puntos siguiendo una
  distribución más o menos lineal. Se considera un subespacio de dimensión 1, una recta. Se desea que
  las proyecciones de los puntos sobre esta recta mantengan sus posiciones relativas. Puede calcularse
  (esta recta) usando cálculo geométrico y minimizando la suma de las distancias de los puntos a la
  recta de proyección, lo cual equivale a maximizar la suma al cuadrado de los valores de las
  proyecciones. Al ser variables de media cero, ello equivale a maximizar la suma de las varianzas.
  Intuitivamente supone encontrar la recta que más cerca pase de todos los puntos y mejor mantenga
  (al proyectarse esos punto en sí misma) la variabilidad original.


  El primer componente principal  se define como la combinación lineal de las variables originales
  que tienen varianza máxima. Con el planteamiento geométrico anterior y teniendo presentes las
  varianzas iniciales, el primer desarrollo matemático de la técnica de los componentes principales,
  plantea cómo ir calculando uno por uno dichos componentes. 


  \subsubsection{Conceptos Básicos}


  Una imagen puede considerarse como un vector de píxeles donde el valor de cada componente es un valor
  en escala de grises ($0-255$). Por ejemplo, una imagen de $70 \times 75$ puede abrirse y tratarse como un vector
  de longitud $5250$.

  \begin{center}
  \begin{figure}[ht]
  \centering
  \includegraphics[width=1.5in]{images/lineal}
  \caption{Una imagen bidimensional Im(i,j) de tamaño $i \times j$ puede ser vista como un vector $X$ de tamaño $N = i \times j$}
  \label{fig:Representacion de una imagen bidimensional a un vector}
  \end{figure}
  \end{center}


  
  De esta forma, la imagen queda situada en un espacio $N$-dimensional, donde $N$ es el número de píxeles
  de la imagen. Esta representación vectorial de la imagen es considerado su espacio original.

  El espacio original de una imagen es uno de los espacios en los que puede examinarse una imagen. Otro
  de los espacios es el eigenespacio, que es creado por los eigenvectores (vectores propios) de la 
  matriz de covarianza de las imágenes de entrenamiento, que se obtienen mediante el PCA. El eigenespacio
  optimiza la variación entre las imágenes.


  \begin{center}
  \begin{figure}[ht]
  \centering
  \includegraphics[width=2in]{images/valorpropio}
  \caption{Los vectores propios de un operador lineal son los vectores no nulos que, cuando son transformados 
	por el operador, dan lugar a un multiplo escalar de sí mismos. Este escalar $\lambda$ recibe el nombre valor
	propio.}
  \label{fig:Representacion de valores y vectores propios}
  \end{figure}
  \end{center}

  Para calcular el eigenespacio, se identifican los eigenvectores de la matriz de covarianza 
  obtenida del conjunto de imágenes de entrenamiento. Los eigenvectores correspondientes a eigenvalores 
  (valores propios) no nulos de la matriz de covarianza forman una base ortonormal que refleja las 
  imágenes en un espacio N-dimensional.

  \subsubsection{Algoritmo del PCA}

  \begin{center}
  \begin{figure}[ht]
  \centering
  \includegraphics[width=1.2in]{images/algoritmopca} % 
  \caption{Pasos del algoritmo PCA.} 
  \label{fig:pca}
  \end{figure}
  \end{center} 

  El proceso de reconocimiento se divide en dos fases fundamentales: entrenamiento y prueba.

  \subsubsection{Fase de Entrenamiento:} \label{faseentrenamiento}

    \begin{description}
    	\item[Obtener Conjunto de Datos] \label{conjuntodatos}
		Almacenar cada una de las imágenes en un vector de longitud $N$.

		  \begin{center}
		  \begin{figure}[ht]
		  \centering
		  \includegraphics[width=3in]{images/img2vector}
		  \caption{Representación de una imagen a un vector.}
		  \label{fig:Representacion de una imagen a un vector}
		  \end{figure}
		  \end{center}

		  \vspace{1em}

	\item[Restar la Media] \label{restarmedia}

		  Calcular la imagen media de las $M$ imágenes y centrar las imágenes 
		  (sustrayendo la imagen media de cada vector imagen).
		  Se busca producir un conjunto de datos donde la media es cero,
		  restando la media de cada una de las dimensiones de los datos.

		  \begin{center}
		  \begin{math}
		  \widetilde{m} = \frac{1}{M} \displaystyle \sum_{i=1}^{M}{ \overrightarrow{\Psi^{i}} }
		  \end{math}

		  \vspace{1em}

		  \begin{math}
		  \widetilde{ \Psi ^{i} } = \overrightarrow{\Psi^{i}} - \widetilde{m} 
		  \end{math}

		  \end{center}
		  \vspace{1em}

	\item[Calcular la Matriz de Covarianza] \label{matrizcovarianza}
		  Para obtener la matriz de covarianza primero se necesita combinar los vectores de entrenamiento, 
		  obteniendo una matriz de $N \times M$ (donde $M$ es el número de imágenes).

		  \begin{center}
		  \begin{math}
		  {\Psi} = [ \widetilde{\Psi^{1}} \widetilde{\Psi^{2}} \dots \widetilde{\Psi^{M}}]
		  \end{math}

		  \end{center}

		  La matriz de covarianza tiene como máximo $M$ vectores propios asociados a $M$ valores propios no nulos,
		  siempre que sea $M<N$, es decir, sea mayor el tamaño de la imagen que el número de imágenes.

		  \begin{center}
		  \begin{math}
		  \Omega = \Psi \times \Psi^{T}
		  \end{math}

		  \end{center}
		  \vspace{1em}

	\item[Calcular Valores Propios y los Vectores Propios de la Matriz de Covarianza] \label{vvmc}

		  Cal\-cu\-lar y ordenar los vectores propios de manera descendente, según el valor propio asociado. 
		  El vector propio asociado al máximo valor propio es el vector propio que se encuentra con mayor 
		  variación en las imágenes, y el más pequeño de los valores propios es el que tiene su vector 
		  propio asociado con menor variación en las imágenes. Con esto se busca obtener los patrones sobre
		  los datos, en este paso es donde se extrae las líneas que caracterizan los datos.

		  Es complicado realizar esta implementación ya que la matriz de covarianza $\Omega$ es de 
		  tamaño $N \times N$, donde $N$ es el tamaño del vector generado a partir de la imagen, si las imágenes 
		  son de $70 \times 75$, la matriz de covarianza es de tamaño $5250 \times 5250$; por lo que resulta demasiado costoso 
		  encontrar los vectores propios.Para resolver este problema existe una solución conocida como el truco
		  de Turk y Pentland: hay un teorema de álgebra lineal que establece que los eigenvalores de 
		  $\Omega ' = \Psi \times \Psi^{T}$  y los de $\Omega ' = \Psi^{T} \times \Psi$ son los mismos.
		  Por tanto, los eigenvectores de $\Omega$ son los mismos que los de $\Omega '$ multiplicados por la matriz
		  $\Psi$ y normalizados. De esta forma, este teorema puede utilizarse para crear el eigenespacio 
		  a partir de una matriz de tamaño $M \times M$ (M es el número de imágenes) en vez de utilizar 
		  una matriz de covarianzas de tamaño $N \times N$.

		  \begin{center}
		  \begin{math}
		  \Omega ' = \Psi^{T} \times \Psi
		  \end{math}

		  \end{center}

		  Tomando en cuenta que para que los vectores propios de $\Omega$ sean $\Omega'$, estos se deben calcular como:

		  \begin{center}
		  \textit{Vectores propios de} $\Omega$ = \textit{Vectores propios} $\Omega' \times \Psi$
		  \end{center}
		  \vspace{1em}


		  \begin{center}
		  \begin{figure}[ht]
		  \centering
		  \includegraphics[width=3in]{images/covarianza}
		  \caption{La matriz de Covarianza $\Omega$ es demasiado grande para ser manejable, por lo que 
			  se considera la matriz $\Omega'$ cuyo tamaño es mucho menor que el de $\Omega$.}
		  \label{fig:Truco de Turk y Pentland}
		  \end{figure}
		  \end{center}

	\item[Elegir Componente] \label{ec}
		  Aquí se busca comprimir los datos y reducir la dimensión de los mismos, ordenando los valores propios de mayor a menor.
		  Originalmente tenemos un número de dimensiones y se espera al concluir este paso que ese número sea menor al inicial.

		  Los vectores propios determinan el espacio de los rostros, como máximo se pueden tener M vectores propios,
		  por lo tanto el parámetro de comprensión está dado por los “q” vectores propios de mayor valor propio asociado 
		  que se seleccionen, dado que indica la dimensión del vector de características que va a representar a la imagen original.

		  \vspace{1em}
		  \textit{Método de Selección del Valor de $q$}
		  \vspace{1em}

		  Para determinar la selección del valor “q” (cantidad de vectores propios a conservar) se calcula la conservación 
		  de energía E, donde se elige el valor “q” que mantenga un umbral definido de la energía total.

		  Si se define la energía $E_{q}$ como la energía del vector propio q, esta es la relación de la suma de todos los 
		  valores propios mayores o iguales a q (incluyendo el valor propio de q), sobre la suma de todos los valores propios.

		  \begin{center}
		  \begin{math}
		   E_{q} = \frac{\sum_{j=1}^{q} \lambda_{i}}{\sum_{j}^{M}\lambda_{i}}
		  \end{math}

		  \end{center}

		  Se realiza una curva ROC para obtener el valor óptimo de q entre la demanda computacional, 
		  la reducción de la dimensión y la energía conservada.
		  \vspace{1em}

	\item[Formar el Vector Característico] \label{fvc}

		  Para formar el vector característico podemos optar por dejar de lado los más pequeños, es decir, los menos relevantes.

		  Cada coeficiente de la representación de la imagen se obtiene proyectándola sobre cada uno de los vectores de la base PCA.

		  \begin{center}
		  \begin{math}
		  \overrightarrow{\omega^{i}} = \widehat{V}^{T} \times \widetilde{\Phi}^{i}
		  \end{math}

		  \end{center}


		  El nuevo vector $\overrightarrow{\omega^{i}}$ de la imagen proyectada tendrá q componentes. Las proyecciones 
		  de las imágenes de entrenamiento dentro del subespacio son denominadas clases.
		  \vspace{1em}

    \end{description}
	

  \subsubsection{Fase de Prueba:} \label{faseprueba}

      \begin{description}

	  \item[Determinación del Nuevo Conjunto de Datos] \label{dncd}

	  Una vez elegidos los componentes (vectores propios) que deseamos tener en nuestros datos, y después de haber 
	  formado el vector característico se lleva a cabo este paso. Para clasificar las imágenes del banco de datos 
	  se deberán repetir los primeros tres pasos de este algoritmo, sin embargo la imagen media que se resta es la misma que se obtuvo con 
	  el conjunto de entrenamiento.

	  Esta nueva matriz $\varphi$ es proyectada dentro del mismo eigenespacio definido por $\widehat{V}$.

	  \begin{center}
	  \begin{math}
	  \overrightarrow{t}^{i} = \widehat{V}^{T} \times \widetilde{\varphi}^{i}
	  \end{math}

	  \end{center}

	  La proyección de la imagen $\overrightarrow{t}^{i}$ es la que se compara con cada una de las clases.

      \end{description}
  
  \subsection{K - Vecinos Más Cercanos (KNN)}

  \begin{center}
  \begin{figure}[ht]
  \centering
  \includegraphics[width=1in]{images/proceso02}
  \caption{Proceso para el reconocimiento facial.}
  \label{fig:PRF2}
  \end{figure}
  \end{center}

  El método k-nn (\textit{K nearest neighbors}) es un método de clasificación supervisada
  (Aprendizaje, estimación basada en un conjunto de entrenamiento y prototipos).

  En el reconocimiento de patrones, el algoritmo k-nn es usado como método de clasificación de objetos 
  (elementos) basado en un entrenamiento mediante ejemplos cercanos en el espacio de los elementos.
  K- nn parte de la idea de que una nueva muestra será clasificada a la clase a la cual pertenezca 
  la mayor cantidad de vecinos más cercanos del [Reconocimiento de patrones patrón] del conjunto de 
  entrenamiento más cercano a ésta.

  \subsubsection{Regla K-NN} \label{regla}

  Al aplicar la regla NN, se explora todo el conocimiento almacenado en el conjunto de entrenamiento
  para determinar cuál será la clase a la que pertenece una nueva muestra, pero únicamente tiene en cuenta 
  el vecino más próximo a ella, por lo que es lógico pensar que es posible que no se esté aprovechando 
  de forma eficiente toda la información que se podría extraer del conjunto de entrenamiento.

  Con el objetivo de resolver esta posible deficiencia surge la regla de los k vecinos más cercanos (k-NN). 
  La regla k-NN es una extensión de la regla NN, en la que se utiliza la información suministrada por los
  k prototipos del conjunto de entrenamiento más cercanos de una nueva muestra para su clasificación.
  \vspace{1em}

  \textit{Ejemplo de funcionamiento}

  \begin{center}
  \begin{figure}[ht]
  \centering
  \includegraphics[width=2.0in]{images/knn}
  \caption{K-Vecinos Más Cercanos.}
  \label{fig:knn}
  \end{figure}
  \end{center}

  La figura \ref{fig:knn} muestra el funcionamiento de esta regla de clasificación. 
  En ella se encuentran representadas 12 muestras pertenecientes a dos clases distintas:
  la Clase 1 está formada por 6 cuadrados de color azul y la Clase 2 formada por 6 círculos de color rojo. 
  En este ejemplo, se han seleccionado tres vecinos, es decir, ($k = 3$).

  De los 3 vecinos más cercanos a la muestra x, representada en la figura por una cruz, uno de 
  ellos pertenece a la Clase 1 y los otros dos a la Clase 2. Por tanto, la regla 3-NN asignará 
  la muestra $x$ a la Clase 2. Es importante señalar que si se hubiese utilizado como regla de clasificación la NN, 
  la muestra $x$ sería asignada a la Clase 1, pues el vecino más cercano de la muestra $x$ pertenece a la Clase 1.

  \subsubsection{Ventajas y Limitantes} \label{vl}

  En problemas prácticos donde se aplica esta regla de clasificación se acostumbra tomar un número k de vecinos
  impar para evitar posibles empates, aunque esta forma es cierta en problemas que poseen dos clases nada más.
  También, los empates pueden ser resueltos decidiendo aleatoriamente la clasificación de la muestra entre las 
  clases empatadas o la clase donde la distancia media de sus vecinos sea inferior.

  Para determinados problemas reales (es decir, con un número finito de muestras e incluso, en muchas ocasiones, 
  un número relativamente pequeño), la aplicación de esta regla podría entenderse como una solución poco apropiada, 
  debido a los pobres resultados que pudieran obtener, es decir, a su baja tasa de aciertos en el correspondiente 
  proceso de clasificación. Este problema también está presente cuando el número de muestras de que se dispone
  puede considerarse pequeño comparado con la dimensionalidad intrínseca del espacio de representación, 
  lo cual corresponde a una situación bastante habitual.


  \subsubsection{Algoritmo KNN}

  Se tienen tres conjuntos de datos, el conjunto de entrenamiento que utilizaremos para el aprendizaje 
  del clasificador y los conjuntos de validación y de test con los que comprobaremos
  si el clasificador es capaz de generalizar, es decir si presenta buenos resultados al introducir 
  datos no empleados durante el entrenamiento.

  A continuación se describen los pasos para la implementación de este algoritmo:

  El proceso de aprendizaje de este clasificador consiste en almacenar en un vector el conjunto de entrenamiento,
  junto a la clase asociada a cada muestra de este conjunto. 

  En primer lugar, y con motivo del aprendizaje del algoritmo,
  calcularemos la distancia euclidea de cada muestra de entrenamiento,
  a todas las demás que tenemos almacenadas en el vector del punto anterior 
  y de las que conocemos la clase a la que corresponden, quedándonos con las K muestras mas
  cercanas y clasificando la nueva muestra de entrenamiento en la clase más frecuente 
  a la que pertenecen los K vecinos obtenidos anteriormente.

  La segunda tarea para diseñar el clasificador, es realizar el
  mismo proceso con los datos de validación Se calcula el porcentaje
  de clasificación sobre los ejemplos de este conjunto
  (desconocidos en la tarea de aprendizaje) para conocer su
  poder de generalización.

  \subsection{Reconocimiento facial}

  El reconocimiento de rostros es un área muy activa en la visión por computadora y los campos de biometría,
  ya que se ha estudiado vigorosamente durante 25 años y dando como resultado la producción de aplicaciones de seguridad,
  robótica, interfaces hombre-máquina, aplicaciones para cámaras digitales, juegos y entretenimiento.


    \begin{center}
    \begin{figure}[ht]
    \centering
    \includegraphics[width=4.0in]{images/recocara.png}
    \caption{El reconocimiento automático de caras, se puede realizar por medio de un vídeo o una fotografía.}
    \label{fig:reccara}
    \end{figure}
    \end{center}


	 \subsubsection{Vídeo}
	   Si se dispone de una secuencia de video, la localización de objetos en la imagen es más factible. 
	   Una de las mejores formas es mediante diferencia de fotogramas. Existen técnicas que miden variaciones 
	   verticales y horizontales para encontrar los ojos. Detectar contornos de una escena en movimiento 
	   es más sencillo. Se utilizan filtros espaciotemporales de gaussiana para encontrar los bordes de la cara
           y el cuerpo. También existen técnicas que trabajan con la velocidad a la que se mueven ciertas regiones
           de la escena. En estas técnicas se completa la localización de la cara con un algoritmo que construye 
	   una elipse ajustándola.
	   
	   
	   Una de las aplicaciones más importantes del reconocimiento de cara es en sistemas de videovigilancia.
           Algunos ejemplos son: Detectores de cansancio para conductores, sistemas de control doméstico, etc.
           
           Sin embargo, reconocer sujetos para video-vigilancia conlleva algunas dificultades:
           
           \begin{description}
           
           \item [Baja calidad de video.] Cámaras situadas en sitios con luz natural y que no existe colaboración de
           los sujetos, oclusión parcial, etc.
           
           \item [La imagen de la cara una vez tomado el video queda muy pequeña.] Por las mismas condiciones
           de adquisición de los datos la cara puede llegar a ser diminuta y no se alcanzan los tamaños
           asumidos en la mayoria de sistemas de reconocimiento de caras.
           
           \item [Características propias humanas.] Una de las principales razones de la viabilidad de una
           descripción genérica de comportamiento humano es que la variación intrínseca de objetos
           humanos y en particular faciales es mucho más pequeña que la variación con respecto a los
           objetos contextuales. Por ejemplo, es mucho más facil detectar y localizar caras que reconocer
           una cara específica.
           \end{description}


	\subsubsection{Foto}

	   En estas técnicas, por lo contrario, el objeto de estudio es la imagen misma. El conocimiento
           previo se incorpora implícitamente en esquemas de entrenamiento. Se trabaja directamente con
           una representación de la imagen a la que se le aplican algoritmos de entrenamiento y análisis.

		 \begin{description}
           
                \item [Métodos basados en subespacios:]

		Se basan en los trabajos de Sirovich y Kirby y los desarrollos posteriores de Turk y Pentland.
		Consideran las imágenes de caras humanas como un subespacio lineal de un espacio mayor
		(de todas las imágenes). Al representarlas así pueden utilizarse muchos métodos para tratar
		los datos: análisis estadístico multivariante, redes neuronales, etc.


		\item [Redes neuronales:]

		Las redes neuronales se han convertido en una técnica popular para el reconocimiento de
		patrones. Se entrenan las redes neuronales con imágenes con caras e imágenes sin caras. 
		Se resuelven problemas de solapamiento de regiones ya que estas técnicas son usadas para 
		verificar si una foto es de una cara o no. También se han utilizado este tipo de técnicas 
		para detección de rasgos.


		\item [Métodos estadísticos:]

		Hacen referencia a métodos basados en teoría de la información. También se incluyen aquí técnicas
		que utilizan máquinas de vectores soporte y reglas de decisión de Bayes.

	       \end{description}

		

    \subsubsection{Fases del Reconocimiento}

    \begin{center}
    \begin{figure}[ht]
    \centering
    \includegraphics[width=1.5in]{images/pasosrec.png}
    \caption{El reconocimiento facial se lleva acabo generalmente en dos fases: detección y reconocimiento del rostro.}
    \label{fig:knn}
    \end{figure}
    \end{center}

  
   \begin{description}
   \item[Detección]
    La detección del rostro consiste en buscar la cara de algún individuo dentro del campo de visión que tiene 
    una cámara web, o bien, identificarlo en alguna fotografía. Se debe omitir todo lo demás para poder trabajar
    solamente con el rostro.

    \begin{center}
    \begin{figure}[ht]
    \centering
    \includegraphics[width=2.0in]{images/deteccion}
    \caption{Aquí se muestra la detección del rostro con un recuadro rojo. }
    \label{fig:knn}
    \end{figure}
    \end{center}

    \item[Reconocimiento]

    El reconocimiento facial consiste en comparar la imagen con las que se tienen en un banco de datos para 
    decidir a que persona pertenece.
    
    \begin{center}
    \begin{figure}[ht]
    \centering
    \includegraphics[width=2.0in]{images/caras}
    \caption{El reconocimiento consiste en comparar y decidir si una imagen pertenece a la misma persona. }
    \label{fig:knn}
    \end{figure}
    \end{center}
    \end{description}
 

 \section{Herramientas}

  Las herramientas examinadas para la realización de este proyecto se describen a continuación:

  \subsection{Python}

  Es un lenguaje con una sintaxis muy limpia y que favorece un código legible. Python es un un lenguaje interpretado
  o de script, con tipado dinámico, fuertemente tipado, multiplataforma y orientado a objetos.

  Un lenguaje interpretado o de \textit{scripting} es aquel que al ejecutarse utiliza un intérprete (programa intermedio),
  en lugar de ser compilado el código a lenguaje máquina que pueda ser comprendido y ejecutado directamente en una computadora
  (lenguajes compilados).Una desventaja de Python ante los lenguajes compilados, es que la ejecución de un programa escrito en Python es mas lenta. Sin embargo los 
  lenguajes interpretados son más flexibles y más portables. Python tiene, no obstante, muchas de las características de los lenguajes compilados. En Python el código fuente se traduce
  a un pseudo código máquina intermedio llamado bytecode la primera vez que se ejecuta, generando archivos .pyc o .pyo (bytecode 
  optimizado), que son los que se ejecutarán en sucesivas ocasiones.

  Otra característica de Python es el tipado dinámico, este se refiere a que no es necesario declarar el tipo de dato que 
  va a contener una determinada variable, sino que su tipo se determinará en tiempo de ejecución según el tipo del valor 
  al que se le asigne, y el tipo de esta variable puede cambiar si se le asigna un valor de otro tipo.

  También es fuertemente tipado, es decir, no permite tratar a una variable como si fuera de un tipo distinto al que tiene,
  es necesario convertir de forma explícita la variable al nuevo tipo. Esta es una ventaja sobre otros lenguajes, ya que es
  menos propenso a errores.

  El intérprete de Python está disponible en multitud de plataformas (UNIX, Solaris, Linux, DOS, Windows, OS/2, Mac OS, etc.)
  por lo que si no utilizamos bibliotecas específicas de cada plataforma nuestro programa podrá correr en todos estos sistemas 
  sin grandes cambios.

  Python también permite la orientación a objetos, programación imperativa, programación funcional y programación orientada 
  a aspectos.


    \subsubsection{OpenCV}

      Esta biblioteca libre que es comúnmente utilizada en aplicaciones cuya función es reconocer rostros. Ya que sirve para 
      programar aplicaciones de visión artificial por computadora en tiempo real. La biblioteca fue desarrollada 
      en C++ y cuenta con varias interfaces para usarla, entre ellas, una para Python.

      OpenCV es multiplataforma, existien versiones para GNU/Linux, Mac OS X y Windows. Además que contiene más de 500
      funciones que abarcan una gran gama de áreas en el proceso de visión, entre ellas reconocimiento facial, 
      calibración de cámaras, visión estereo y visión robótica.

      El proyecto de OpenCV pretende proporcionar un entorno de desarrollo fácil de utilizar y altamente eficiente. 
      Esto se ha podido lograr, realizando su programación en código C y C++ optimizados.

  
    \subsubsection{Módulo Image Python}

      El módulo Image de python, proporciona una clase que se utiliza para representar una imagen PIL.
      Este módulo también proporciona una serie de funciones para manipular imágenes fácilmente, el cual
      incluye funciones de carga de imágenes de archivos, crear nuevas, escalar, convertir y guardar.

      Image es de gran utilidad para llevar a cabo el procesamiento de las imágenes, ya que permite 
      manipular y modificar imágenes de manera de automática.

      
    \subsubsection{NumPy}

      NumPy es una extensión de Python que permite manipular de manera rápida y eficiente arreglos Numéricos 
      tales como vectores y matrices (pero también arreglos multidimensionales de rango arbitrario).
      Un programa Python que maneje estos objetos ejecuta a velocidades comparables con un programa escrito 
      en C o C++. De hecho, NumPy está escrito usando C. 

      Además, las operaciones entre vectores y matrices se realizan internamente recurriendo a las bibliotecas 
      "BLAS" (Basic Linear Algebra System) y "LAPACK" (Linear Algebra Package) las cuales proporcionan una extensa
      colección de rutinas para realizar operaciones entre vectores y matrices así como operaciones de álgebra lineal.

      NumPy consiste de un conjunto de módulos. El más importante es numpy. Este módulo define dos nuevos objetos.
      Arreglos Numéricos (objetos de tipo array) y funciones universales que operan sobre estos arreglos 
      (objetos de tipo ufunc). Otro módulo importante es LinearAlgebra, ya que proporciona funciones para invertir matrices,
      calcular vectores y valores propios, etc. 


    \subsubsection{Matplotlib}

      Matplotlib es una biblioteca gráfica, muy parecida en su concepción a los comandos gráficos de Matlab. 
      Esta biblioteca permite generar gráficos en 2D y 3D, así como procesar imágenes de varios formatos. 
      Puede ser usada desde \textit{scripts} en Python o de forma interactiva a través del intérprete. De forma sencilla,
      se pueden generar gráficas, histogramas, barras de error, plots de dispersión, etc.

      En el paquete de Matplotlib, se encuentra pylab que es un módulo que se instala junto matplotlib, también se encuentra 
      matplotlib.pyplot que es un módulo en matplotlib.

      Pyplot proporciona la interfaz de máquina de estados subyacentes a la biblioteca de trazado en matplotlib. 
      Esto significa que las cifras y los ejes son, implícitamente, y se crea automáticamente.

      En cambio pylab combina la funcionalidad pyplot (para imprimir) con la funcionalidad numpy 
      (para las matemáticas y para trabajar con matrices) en un único espacio de nombres, 
      por lo que ese espacio de nombres (o el medio ambiente) es más similar a MATLAB. 

      La interfaz pyplot se prefiere para secuencias de comandos. Y la interfaz pylab es conveniente para el 
      cálculo interactivo y el trazado, ya que minimiza escribir. 
    
 
  
  
  \section{Actividades realizadas}

  Se decidió utilizar el lenguaje de programación Python, para la implementación del prototipo,
  ya que este lenguaje nos permite construir rapidamente prototipos para realizar pruebas, y también
  por que ofrece diversas bibliotecas que ayudan a resolver clara y eficientemente el reconocimiento facial,
  como lo es OpenCV.

  El problema se dividió en tres partes: la detección, el reconocimiento y las pruebas.

 \subsection{Detección}

  Para resolver la detección de los rostros, el problema se dividió en los siguientes pasos:

  \begin{center}
  \begin{figure}[ht]
  \centering
  \includegraphics[width=1.0in]{images/procesodeteccion.png}
  \caption{Proceso para la detección de un rostro.} 
  \label{fig:procdetectros}
  \end{figure}
  \end{center}

  \subsubsection{Captura de video}

  Una de las tareas fundamentales que requiere el prototipo para ser funcional, es poder capturar video, por
  medio de un cámara web, y que despliegue en pantalla las imágen conforme la captura. Para la captura de video 
  se utilizaron algunas funciones que provee OpenCV.

  \subsubsection{Detección de rostro}

  Para poder detectar un rostro, es necesario crear los archivos donde se describen los patrones que se 
  quieren reconocer, OpenCV contiene una serie de archivos que cuentan con la descripción de varios patrones,
  que sirven para la detección del reconocimiento facial. En caso de que el patrón no este definido en esta	
  biblioteca, OpenCV permite crear los propios, bajo cierta estrutura que se define en un XML.

  Para esta etapa del prototipo, solo se detectaran rostros que se encuentre de frente a la webcam. Entonces se
  tiene que definir la ubicación del archivo que decribe este patrón.

  Se construye una función para detectar el patrón en el video, una vez que se inicia una detección general del
  rostro esta función tiene que devolver que encontró un rostro. Entonces se procede a encontrar la región de
  la imagen en que se detectó la cara y se pinta un recuadro rojo en esa región, para mostrar que ya se detectó 
  el rostro.

  \subsubsection{Procesamiento de imágenes} 

  Después de detectar el rostro, se selecciona la región del rostro, para enseguida recortar solamente ese
  espacio de la imagen, y así eliminar la información que no es de utilidad para el reconocimiento.

  Lo siguiente es escalar la imagen a dimensiones más pequeñas para que la manipulación de 
  la misma sea más fácil, finalmente se convierte a escala de grises y se guarda con formato PGM.

  Se utiliza el formato PGM, ya que alamacena las imágenes en escala de grises, este fromato es muy amigable
  para el procesamiento de las imágenes, por su simplicidad y eficiencia. Además de que guarda los vaores de los
  píxeles en formato ASCII o en formato Binario.


 \subsubsection{Construcción de base de datos}

  Para construir la base de datos, se tiene que crear para cada individuo una carpeta, donde se guardaran sus imágenes.
  Despúes se repiten todos los pasos de la detección hasta obtener el número de imágenes deseadas por individio.

  
 \subsection{Reconocimiento}

     Para resolver el reconocimiento de los rostros, el problema se dividió en los siguientes pasos:

  \begin{center}
  \begin{figure}[ht]
  \centering
  \includegraphics[width=1.0in]{images/pcaknn.png} % 
  \caption{Para el proceso de selección se aplicaron el método estadístico PCA y el clasificador KNN.} 
  \label{fig:pcaknn}
  \end{figure}
  \end{center}

  \subsubsection{PCA}

    Se realizo una implementación del PCA para imágenes, con esta implementación obtuvimos la reducción
    de dimensionalidad, así como la variabilidad de los datos de entrenamiento con el menor número 
    de dimensiones que fue posible. Ya que la matriz de proyección resultante puede ser vista como un 
    cambio de coordenadas en un sistema donde las coordenadas están en orden decreciente de importancia.

 
  \subsubsection{KNN}
  
  Para llevar a cabo la calsificación, se implementó el algoritmo KNN, por su simplicidad. 

  \subsection{Pruebas}

  Al finalizar todas las actividades anteriores, se realizaron las pruebas que se detallan a continuación:

  \subsubsection{Infraestructura}

   Para llevar a cabo las distintas pruebas, se utilizaron 3 computadoras de características diferentes,
   las cuales se describen enseguida:
  
  
    \begin{description}
    \item [Laptop DELL Studio 15.]
    Con cámara web de 2.0 megapíxeles
        
    \item[Laptop HP Pavillion.]
    Con cámara web de 2.0 megapíxeles
    
    \item[Laptop lenovo ideapad.]
    Con cámara web de 2.0 megapíxeles
     \end{description}
    

    Las pruebas que se realizaron con la infraestructuta y las bases de datos construidas, son las siguientes:

   \subsubsection{Comparar webcam}

      \textbf{Objetivo:}

      Con esta prueba se pretende analizar si las características de las webcam, impactan el comportamiento de
      la aplicación.


      \textbf{Descripción:}

      Esta prueba se realiza en la fase de detección, la cual implica realizar los siguientes pasos:

	\begin{enumerate}
	 \item Captura de video
	 \item Detección de rostro
	 \item Procesamiento de imágenes
	 \item Construcción de la base de datos
	\end{enumerate}

      \textbf{Resultados esperados:}

      Como resultados de esta prueba se espera obtener una base de datos generada a partir de las condiciones 
      establecidas.


   \subsubsection{Comparar bases de datos}

      \textbf{Objetivo:}

      Con esta prueba se pretende analizar si la calidad de las imágenes que contienen las bases de datos,
      impactan el comportamiento de la aplicación.

      \textbf{Descripción:}

      Esta prueba se realiza en la fase de reconocimiento, la cual implica realizar los siguientes pasos:

	\begin{enumerate}
	 \item Realizar PCA
	 \item Realizar Knn
	\end{enumerate}

      \textbf{Resultados esperados:}

      Como resultados se espera obtener las tasas de error de cada algoritmo, para poder hacer una comparación 
      respecto a cada una de las bases de datos.



   \subsubsection{Para una persona}

      \textbf{Objetivo:}

      El objetivo de esta prueba es analizar la tasa de error para los algoritmos del PCA y Knn, cuando las 
      imágenes con las que trabajan, solo pertenecen a una sola persona.

      \textbf{Descripción:}

      Esta prueba se lleva a cabo en la fase de reconocimiento, la cual implica realizar los siguientes pasos:

	\begin{enumerate}
	 \item Realizar PCA
	 \item Realizar Knn
	\end{enumerate}

      \textbf{Resultados esperados:}

      Como resultados se espera obtener tasas de error menores en comparación con las pruebas para varias personas.

      
   \subsubsection{Para varias personas}

      \textbf{Objetivo:}

      El objetivo de esta prueba es analizar la tasa de error para los algoritmos del PCA y KNN, cuando las 
      imágenes con las que trabajan, pertenecen a varias personas.

      
      \textbf{Descripción:}

      Esta prueba se repetira varias veces con diferentes bases de datos, así como con valores para las caras de entrenamiento 
      y las cara de prueba distintos. Esta prueba se lleva a cabo en la fase de reconocimiento y  la cual implica realizar 
      los siguientes pasos:

	\begin{enumerate}
	 \item Realizar PCA
	 \item Realizar Knn
	\end{enumerate}

      \textbf{Resultados esperados:}
      
      Como resultados se espera obtener las tasas de error de cada algoritmo, para poder hacer una comparación 
      respecto a cada una de las condiciones iniciales establecidas.

   \subsubsection{Usando lente, gorro, barba}


      \textbf{Objetivo:}

      El objetivo de esta prueba es analizar la tasa de error para los algoritmos del PCA y KNN, cuando los rostros
      de las personas se ven obstaculizados por el uso de lentes, gorros y barba. Para esta prueba se utiliza una base
      de datos con imágenes de varias personas.
      
      \textbf{Descripción:}

      Esta prueba se lleva a cabo en la fase de reconocimiento, la cual implica realizar los siguientes pasos:

	\begin{enumerate}
	 \item Realizar PCA
	 \item Realizar Knn
	\end{enumerate}
      
      \textbf{Resultados esperados:}

      Como resultados se espera obtener las tasas de error para los algoritmos PCA y Knn.




      
